#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>


//int main()
//{
//    char ch1[] = { 'a', 'b', 'c' };
//    此时ch1这个数组中只放了三个元素 'a'和'b'和'c'
//    准确地说，是放了三个字母对应的ASCII值，分别是97和98和99

//    char ch2[] = "abc";
//    此时ch2这个数组中放了四个元素 'a'和'b'和'c'和'\0'
//    准确地说，是放了这四个字符对应的ASCII值，分别是97和98和99和0
//    return 0;//
//}

//int main()
//{
//	int arr[3] = "abc";
//  想要以这种方式定义字符串，必须要用'\0'结束，
//	也就是要给'\0'留有空间

//	printf("%s", arr);
//  这句是错的，因为此时不能使用字符串的形式打印，
//	字符串打印必须要以'\0'为结束标志
//	return 0;//
//}

//int main()
//{
//	int arr1[3][4] = { 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6 };//
//	int arr2[3][4] = { {1,2}, {3,4}, {5,6} };
//  这个二维数组放进去的元素如下
//	1, 2, 0, 0    3, 4, 0, 0    5, 6, 0, 0
//	//可以把这个数组看成一个一维数组，数组的每个元素是一个数组
//	//其中{1, 2, 0, 0 }这个一维数组的数组名是arr2 [0]
//	int arr3[][4] = { {1,2,3,4}, {2,3} };
//  这个二维数组放进去的元素如下
//  1, 2, 3, 4    2, 3, 0, 0
//	return 0;//
//}

int main()
{
    int arr[10] = { 0 };//
    printf("%p\n", arr);//假设此时打印出来的地址的值是00D5F940
    printf("%p\n", arr + 1);//则基于上面的假设，这里打出来的是00D5F944

    printf("%p\n", &arr[0]);//则基于上面的假设，这里打出来的是00D5F940
    printf("%p\n", &arr[0] + 1);//则基于上面的假设，这里打出来的是00D5F944

    printf("%p\n", &arr);//则基于上面的假设，这里打出来的是00D5F940
    printf("%p\n", &arr + 1);//则基于上面的假设，这里打出来的是00D5F968
    //加了一个十六进制数2 8 ，等于十进制数40

    int n = sizeof(arr);//sizeof (数组名) 就是如此的特殊，计算的是整个数组所占内存数
    printf("%d\n", n);//
    return 0;//
}//arr只跟两种操作符，在特定情况下不具备数组首元素地址的性质
 //1、sizeof (孤零零的数组名)
 //2、& 孤零零的数组名

//int main()
//{
//	int arr[3][4];//
//	int sz = sizeof(arr);//
//	printf("%d\n", sz);//此时还是sizeof (孤零零的数组名) 的情况，
//	//结果是整个数组所占内存的字节数，即sz被赋值为48
//
//	printf("%p\n", arr);//假设此时打印出来的地址的值是00D5F940
//	printf("%p\n", arr + 1);//基于上面的假设，这句打印出来的是00D5F950
//	//说明创建了一个二维数组以后，arr作为二维数组名，arr是一个地址，
//	//地址的值确实是是首元素arr[0][0]的地址，但其访问的步长取决于一个数组σ的所占内存数
//	//σ是一个一维数组，σ作为二维数组的第一个存放的元素，其所占内存数是4*4个
//	//所以二维数组的数组名arr的访问步长是16，即+1后地址+16
//	//这也从一个侧面说明了创建二维数组的时候，一定不能省略列数
//
//	printf("%zd\n", sizeof(arr) / sizeof(arr[0]));//
//	//sizeof (arr [0]) 计算的是sizeof (σ)，arr [0]作为σ的数组名 
//	//sizeof (孤零零的数组名)，计算的就是一维数组σ所占的内存数
//	//sizeof (arr) / sizeof (arr [0])计算的是一个二维数组的行数

//	printf("%zd\n", sizeof(arr[0]) / sizeof(arr[0][0]));//
//	//sizeof (arr [0]) / sizeof (arr [0][0])计算的是一个二维数组的列数
//
//	//以上计算的时候都没有对二维数组进行初始化，
//   //也就是sizeof并不会管你是否在申请的空间内部存放了元素，
//   //在求值时，只会计算应该占了多少的内存空间的字节数
//	return 0;//
//}